iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
0
Modern Web

30天入門JavaScript系列 第 19

【Day 19】利用閉包達成私有變數、記憶化

  • 分享至 

  • xImage
  •  



昨天簡單的介紹甚麼是閉包後,可以知道閉包的特點有

  • 可以存取執行環境結束後的變數
  • 可以作出只有特定函式能使用的變數

這兩點可以使有閉包的函式作出一般函式作不到的事情,下面來實作看看


建立私有變數


全域變數因為大家都能存取的關係,很容易被修改,
區域變數在函式結束後就會消滅,此時利用閉包就能把變數保存起來,並防止其他人存取

function makeclosure() {
  var count = 0;

  return {
    plus1() {
      return ++count;
    },
    minus1() {
      return --count;
    },
  };
}

var countA = makeclosure();

console.log(countA.plus1()); //1
console.log(countA.plus1()); //2
console.log(countA.minus1()); //1
console.log(countA.plus1()); //2


首先在makeclosure宣告了一個區域變數count,並回傳一個有兩個方法的物件,
此時makeclosure結束執行環境消滅,但count變數被閉包保留著,
count只有呼叫兩種方法才能作修改,用其他方式都沒辦法修改count


記憶化


因為閉包的存在可以讓函式有自己的變數,可以紀錄下之前運算過的結果,減少重複運算。

下面是利用閉包計算費式數列

function makeclosure() {
  var Fibonacci = [1, 1];

  return function (num) {
    if (num > Fibonacci.length) {
      for (let i = Fibonacci.length; i < num; i++) {
        Fibonacci[i] = Fibonacci[i - 1] + Fibonacci[i - 2];
      }
    }
    return Fibonacci[num - 1];
  };
}

var func = makeclosure();
//func會回傳費式數列的第N個數

console.log(func(1)); //1
console.log(func(2)); //2
console.log(func(10)); //55
console.log(func(13));//233



這次在makeclosure內建立了一個陣列紀錄算過的數字,當陣列內沒有數列結果時才會作運算,
會減少重複運算的時間(但多花了陣列的記憶體空間)


上一篇
【Day 18】閉包 closure
下一篇
【Day 20】物件(二) 建構器函式跟new運算子
系列文
30天入門JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言